[Update] ทดลอง Deploy PHP ใน Elastic Beanstalk และเชื่อมต่อกับ RDS

[Update] ทดลอง Deploy PHP ใน Elastic Beanstalk และเชื่อมต่อกับ RDS

เราสามารถ Deploy โปรเจกต์ของเราใน Elastic Beanstalk เพื่อแสดงผลหน้าเว็บไซต์บนเว็บบราวเซอร์ได้อย่างง่ายดาย ในบทความนี้จะมาแนะนำเนื้อหาไปพร้อมกับการใช้งานจริงครับ

สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ

ครั้งนี้จะมาแนะนำเกี่ยวกับวิธีการ Deploy PHP ใน Elastic Beanstalk และเชื่อมต่อกับ RDS แล้ว Insert ข้อมูลลงใน Database เพื่อให้ข้อมูลแสดงบนหน้าเว็บไซต์แบบเรียลไทม์ครับ

นอกจากนี้การอัปเดตและแก้ไขโปรเจกต์ที่ได้ Deploy ไปแล้วก็เป็นส่วนสำคัญ เพราะเมื่อโปรเจกต์มีการอัปเดต ก็จำเป็นต้อง Deploy โปรเจกต์เป็นเวอร์ชันใหม่ใน Elastic Beanstalk ดังนั้นเราก็จะมาอธิบายในส่วนนี้ด้วยครับ

เป้าหมาย

  • สร้าง Application และ Environment ใน Elastic Beanstalk
  • Deploy PHP ด้วย Environments โดยใช้ Platform PHP
  • เชื่อมต่อไปยัง RDS ผ่าน Instance ในโปรแกรม PuTTY
  • Insert ข้อมูลลงใน Database ของ RDS
  • สร้างโปรแกรมที่ใช้ในการแสดงข้อมูล MySQL
  • ทดสอบการแสดงข้อมูลบนหน้าเว็บไซต์แบบเรียลไทม์
  • Update Application versions

สร้าง Resources ที่จำเป็นสำหรับ Elastic Beanstalk

สร้าง Service role และ Instance profile ที่ใช้สำหรับ Elastic Beanstalk ใน IAM

ก่อนสร้าง Environment จำเป็นต้องสร้าง Service role และ Instance profile ใน IAM Role เตรียมไว้ โดยแนะนำให้กำหนดชื่อและ Permissions ตาม Documentation ของ AWS ดังนี้

IAM Role Name Permissions
aws-elasticbeanstalk-service-role AWSElasticBeanstalkEnhancedHealth
AWSElasticBeanstalkService
aws-elasticbeanstalk-ec2-role AWSElasticBeanstalkWebTier
AWSElasticBeanstalkWorkerTier
AWSElasticBeanstalkMulticontainerDocker

ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้

สร้าง Key Pair สำหรับ Elastic Beanstalk

ดูตัวอย่างที่นี่เฉพาะหัวข้อนี้: การสร้าง Key Pair

ตัวอย่างตั้งค่าการสร้าง Key Pairs

※Create Key pair
Name: tinnakorn-test-eb
Private key file format: .ppk

สร้าง Security Group สำหรับ Elastic Beanstalk

ครั้งนี้จะสร้าง Security Group โดยใช้ชื่อว่า tinnakorn-test-eb

เข้ามาที่ Service Amazon EC2 แล้วคลิก Security Groups จากเมนูด้านซ้ายในหัวข้อ "▼ Network & Security"

คลิก Create security group

แล้วตั้งค่า Basic details
・Security group name: tinnakorn-test-eb (ป้อนชื่อตามต้องการ)
・Description: tinnakorn-test-eb (ป้อนตามต้องการ)

จากนั้นเลื่อนลงมาด้านล่างสุด แล้วคลิก Create security group

เมื่อสร้าง Key Pair, Security Groups และ IAM Role (Service role, Instance profile) สำหรับ Elastic Beanstalk เสร็จแล้ว ให้ทำขั้นตอนถัดไปได้เลยครับ

สร้าง RDS

เราสามารถใช้ RDS เป็น Engine type ที่ต้องการได้ แต่ครั้งนี้จะสร้าง RDS เป็น Engine type MySQL เพื่อใช้เชื่อมต่อกับ Instance ที่ถูกสร้างจาก Elastic Beanstalk

ให้สร้าง RDS ตามลิงก์ด้านล่างนี้ (ทำเฉพาะหัวข้อที่ระบุไว้ด้านล่างนี้เท่านั้น เพราะเป็นการเชื่อมต่อกับ Instance ที่ถูกสร้างจาก Elastic Beanstalk)

ตัวอย่างตั้งค่าการสร้าง RDS (MySQL)

※สร้าง Security Group สำหรับ RDS (MySQL)
Basic details
Security group name: tinnakorn-test-rds (ตั้งชื่อที่ต้องการ)
Description: tinnakorn-test-rds (ป้อนตามต้องการ)

Inbound rules
Type: MYSQL/Aurora | Source: Custom | tinnakorn-test-eb (เลือก Security Group ที่ต้องการให้เชื่อมต่อเข้ามา ครั้งนี้คือ tinnakorn-test-eb)

※สร้าง RDS (MySQL)
Choose a database creation method
◎ Standard create

Engine options
Engine type: MySQL
Edition: MySQL Community
Engine Version: MySQL 8.0.35

Templates
◎ Production

Availability and durability
Deployment options: Single DB instance

Settings
DB instance identifier: tinnakorn-test-rds
▼ Credentials Settings
Master username: admin
Master password: PassW0rd (รหัสผ่านนี้เป็นแค่ตัวอย่าง ให้กำหนดรหัสผ่านที่ต้องการ)
Confirm master password: PassW0rd

Instance configuration
DB instance class:
◎ Burstable classes (includes t classes)
db.t3.micro

Storage
Storage type: General Purpose SSD (gp2)
Allocated storage: 20
▼ Storage autoscaling
✅ Enable storage autoscaling

Connectivity
Existing VPC security groups: ✅ tinnakorn-test-rds (เลือก Security Group ที่สร้างสำหรับ RDS (MySQL))

การสร้าง RDS เสร็จเรียบร้อยแล้ว ทำขั้นตอนถัดไปได้เลยครับ

เตรียมไฟล์สำหรับใช้ Deploy ใน Elastic Beanstalk

สร้างไฟล์ info.php บนอุปกรณ์ของเราเตรียมไว้ใช้ Upload ใน Elastic Beanstalk

สร้างไฟล์ info.php

เราสามารถใช้โปรแกรมอะไรก็ได้ในการสร้างไฟล์ info.php บนอุปกรณ์ของเรา แต่ครั้งนี้จะสร้างใน Notepad บน Windows

เปิด Notepad ขึ้นมา แล้วคัดลอก Code ด้านล่างนี้วางลงที่นี่

<?php
phpinfo();

แล้วคลิก File และเลือก Save

เราจะ Save ไฟล์ไว้ที่ไหนก็ได้ แต่ในตัวอย่างนี้คือ
・เลือก Desktop
・File name: info.php (แนะนำให้ตั้งชื่อไฟล์ตามนี้สำหรับการทดสอบ)
・Save as type: All files (*.*)
・Encoding: UTF-8
・คลิก Save

แล้วจะแสดงตามรูปภาพแบบนี้

Compress to ZIP file

จากนั้นปิด Notepad ไปได้เลย แล้วคลิกขวาที่ไฟล์ info.php และเลือก Compress to ZIP file เพื่อบีบอัดไฟล์

แล้วไฟล์ ZIP จะแสดงไอคอนชื่อ info.zip แบบนี้ (สำหรับคนที่ใช้ WinRAR หรือโปรแกรมแตกไฟล์อื่นๆ จะแสดงไอคอนตามโปรแกรมที่เราใช้งาน)

แล้วเปลี่ยนชื่อไฟล์ "info.zip" เป็นวันที่และเวลาปัจจุบันเพื่อให้ง่ายต่อการดู Application versions เช่น 20240308_1450.zip แล้วคลิกเข้ามาก็จะแสดงไฟล์แบบนี้

สร้าง Application ใน Elastic Beanstalk

ค้นหาและเลือก Elastic Beanstalk

เลือก Applications จากเมนูด้านซ้าย

คลิก Create application ด้านขวา

หัวข้อ Application information
・Application name: tinnakorn-test-eb (ป้อนชื่อที่ต้องการ)
แล้วคลิก Create

แล้วจะแสดงหน้าจอแบบนี้

สร้าง Environment ใน Elastic Beanstalk

สร้าง Environment เพื่อใช้สำหรับการ Deploy ไฟล์ PHP

คลิก Create a new environment ใน Application ของเรา

Step 1: Configure environment

หัวข้อ Environment tier
Web server environment (ค่าเริ่มต้น)

หัวข้อ Environment information
ป้อนชื่อที่ต้องการ แต่ตัวอย่างนี้จะใช้ชื่อตามที่ระบบจัดการให้
・Environment name: Tinnakorn-test-eb-env (ค่าเริ่มต้น)
・Domain: Tinnakorn-test-eb-env
・คลิก Check availability (ต้องแสดง ✅ [Domain Elastic Beanstalk] is available แบบนี้)

หัวข้อ Platform
AWS Elastic Beanstalk มี Platform ที่รองรับดังนี้:

  • .NET Core on Linux
  • .NET on Windows Server
  • Docker
  • Go
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby
  • Tomcat

การตั้งค่าหัวข้อ Platform คือ
・Platform: PHP
・Platform branch: ระบบเลือกให้อัตโนมัติ
・Platform version: ระบบเลือกให้อัตโนมัติ (มีการอัปเดตเวอร์ชันใหม่เรื่อยๆ แนะนำให้ใช้เวอร์ชันที่มี (Recommended))

หัวข้อ Application code
・เลือก Upload your code
・เลือก Local file
・คลิก Choose file

แล้วเลือกไฟล์จากที่เก็บไฟล์ของเรา ครั้งนี้ไฟล์ ZIP อยู่ใน Desktop แล้วคลิก Open

แล้วจะแสดง [✅ File name: 20240308_1450.zip] แบบนี้
จากนั้นป้อนชื่อเวอร์ชันในช่อง Version label เช่น 20240308_1450 (แนะนำให้ป้อนเป็นชื่อเดียวกับไฟล์ ZIP ที่บีบอัดไว้ก่อนหน้านี้)

หัวข้อ Presets จะใช้เป็นค่าเริ่มต้น เมื่อตั้งค่าหน้านี้เสร็จแล้ว คลิก Next

Step 2: Configure service access

หัวข้อ Service access
・Service role: Use an existing service role
Existing service roles: aws-elasticbeanstalk-service-role (ระบบเลือกให้ตามที่สร้างตอนแรก)
EC2 key pair: tinnakorn-test-eb (Key Pair ที่สร้างก่อนหน้านี้)
EC2 instance profile: aws-elasticbeanstalk-ec2-role (ระบบเลือกให้ตามที่สร้างตอนแรก)
・คลิก Next

หมายเหตุ: หากไม่สร้าง IAM Role สำหรับ Service role และ EC2 instance profile เตรียมไว้ ระบบจะไม่เลือกให้อัตโนมัติ

Step 3 - optional: Set up networking, database, and tags

Step นี้ระบุว่า "optional" จึงไม่จำเป็นต้องตั้งค่าอะไร เพราะเป็นการทดสอบการใช้งาน ให้คลิก Next ได้เลย

Step 4 - optional: Configure instance traffic and scaling

Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้

หัวข้อ Instances
Root volume (boot device):
・Root volume type: General Purpose (SSD)
・Size: 10 GB (ขั้นต่ำคือ 10 GB)

แล้วเลือก EC2 security groups สำหรับ Elastic Beanstalk ที่สร้างในตอนแรก เช่น tinnakorn-test-eb

หัวข้อ Capacity
・Instance types: t3a.nano

แล้วคลิก Next

Step 5 - optional: Configure updates, monitoring, and logging

Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้

หัวข้อ Managed platform updates
・Managed updates: ▢ Activated (ติ๊ก ✅ ออกเพื่อไม่ให้อัปเดต)
แล้วคลิก Next ด้านล่างสุด

หากต้องการอัปเดต OS โดยอัตโนมัติ ให้ติ๊ก ✅ และเมื่อมีการอัปเดต Instance จะรีสตาร์ทโดยอัตโนมัติ ซึ่งการรีสตาร์ท Instance หรือการอัปเดต OS อาจทำให้เกิดปัญหา เช่น บริการหยุดทำงานระหว่างการดำเนินการ แล้วในกรณีที่ติ๊ก ✅ นี้ จำเป็นต้องยืนยันว่าบริการยังทำงานตามปกติระหว่างการดำเนินการหรือไม่ หากมีความกังวล เราขอแนะนำว่าไม่ต้องไปติ๊ก ✅ ครับ

Step 6: Review

ตรวจสอบการตั้งค่าตั้งแต่ "Step 1 - Step 5" แล้วคลิก Submit ด้านล่างสุด แล้วรอสักครู่

ตรวจสอบหน้าเว็บไซต์

ระหว่างที่ระบบกำลังเริ่มต้นจะมีสถานะเป็น [UnknownPendingOK]
เมื่อระบบเริ่มต้นเสร็จแล้วจะแสดงหน้าจอแบบนี้ โดยมี Running version เป็นชื่อตามที่ป้อนตอนอัปโหลดไฟล์ ZIP และมี Domain ที่เป็นลิงก์สำหรับแสดงผลหน้าไซต์ ทีนี้ให้คลิกลิงก์ Domain เพื่อตรวจสอบหน้าเว็บไซต์ได้เลย

แล้วจะแสดงหน้าจอ 403 Forbidden แบบนี้

ต่อไปให้เพิ่ม path ชื่อไฟล์ /info.php ต่อท้ายลิงก์ที่คลิกจากหน้า Environments ตามตัวอย่างด้านล่างนี้

http://[Domain Elastic Beanstalk]/info.php

ถ้าแสดงหน้าจอแบบนี้ การ Deploy PHP ไฟล์ info.php ก็เสร็จสมบูรณ์

เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY

สิ่งที่จะทำในขั้นตอนนี้คือ:

ตรวจสอบ Instance ID จาก Health

ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: ตรวจสอบ Instance ID จาก Health

ตรวจสอบ IP Address จาก EC2

ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: ตรวจสอบ IP Address จาก EC2

เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY

ตั้งค่าการเชื่อมต่อกับ Instance ในโปรแกรม PuTTY ตามด้านล่างนี้

ดูตัวอย่างที่นี่: การเชื่อมต่อกับ EC2 Instance ด้วย PuTTY

・Session
Host Name: Your Public IPv4 address (IPv4 address ของ Instance)
Saved Sessions: tinnakorn-test-eb (ป้อนชื่อที่ต้องการ)

・Connection
Seconds between keepalives (0 to turn off): 60

・Connection → Data
Auto-login username: ec2-user (บังคับให้ใส่ตามนี้เพราะ AMI เป็น Amazon Linux)

・Connection → SSH → Auth → Credentials
Private key file for authentication → Private key file for authentication:
คลิก Browse... และเลือก your_key_pair.ppk (เช่น tinnakorn-test-eb.ppk)

・Session (กลับมาที่หัวข้อนี้อีกครั้ง)
Saved Sessions: your_session_name (เช่น tinnakorn-test-eb แล้วคลิก Save และคลิก Open)

เมื่อเชื่อมต่อกับ Instance ได้แล้ว จะแสดงหน้าจอแบบนี้

Output

Using username "ec2-user".
Authenticating with public key "tinnakorn-test-eb"
  _____ _           _   _      ____                       _        _ _
 | ____| | __   ___| |_(_) ___| __ )  ___  __ _ _ __  ___| |_ __ _| | | __
 |  _| | |/ _ \/ __| __| |/ __|  _ \ / _ \/ _\ | '_ \/ __| __/ _\ | | |/ /
 | |___| | (_| \__ \ |_| | (__| |_) |  __/ (_| | | | \__ \ || (_| | |   <
 |_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\

 Amazon Linux 2023 AMI

 This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
 WILL BE LOST if the instance is replaced by auto-scaling. For more information
 on customizing your Elastic Beanstalk environment, see our documentation here:
 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.
html

   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@ip-xx-xx-xx-xx ~]$

ตรวจสอบไฟล์ PHP ที่อัปโหลดใน Elastic Beanstalk

รันคำสั่งเข้าสู่ระบบผู้ใช้ระดับสูงสุดหรือ root (Superuser)

sudo su -

Output

[ec2-user@ip-xx-xx-xx-xx ~]$ sudo su -
[root@ip-xx-xx-xx-xx ~]#


รันคำสั่ง Update server ให้เป็นปัจจุบันเสมอ

yum update -y


รันคำสั่ง cd เข้าไปที่โฟลเดอร์ /var/www/html/

cd /var/www/html/

Output

[root@ip-xx-xx-xx-xx ~]# cd /var/www/html/
[root@ip-xx-xx-xx-xx html]#


รันคำสั่งตรวจสอบไฟล์ index.php ในโฟลเดอร์ html นี้

ll

Output

[root@ip-xx-xx-xx-xx html]# ll
total 4
-rw-r--r--. 1 webapp webapp 17 Mar  8  2024 info.php
[root@ip-xx-xx-xx-xx html]#


รันคำสั่งตรวจสอบข้อมูลในไฟล์ info.php จะเห็นว่าแสดงตามที่เราสร้างไว้ (ถ้าต้องการออกจากหน้านี้ให้กดปุ่ม q)

less info.php

Output

<?php
phpinfo();
info.php (END)

ติดตั้ง Client MariaDB

เมื่อติดตั้ง Client MariaDB จะทำให้สามารถเชื่อมต่อกับ RDS จาก Amazon Linux 2023 ได้ แต่ไม่สามารถใช้งาน MariaDB Server ได้ !

รันคำสั่งติดตั้ง Client MariaDB

yum install mariadb105 -y

ทดสอบเชื่อมต่อจาก Instance ไปยัง RDS

Instance ที่จะใช้เชื่อมต่อไปยัง RDS นี้ เป็น Instance ที่กำลังทำงานใน EC2 แต่ถูกสร้างมาจาก Elastic Beanstalk
อย่างไรก็ตาม สามารถเชื่อมต่อจาก Instance นี้ไปยัง RDS ได้เหมือนกับ Instance ที่สร้างด้วยตนเองใน EC2

รันคำสั่ง MySQL เชื่อมต่อจาก Instance ไปยัง RDS (ก่อนรันคำสั่งเปลี่ยนข้อมูลใน [ ] ให้เป็นของคุณ)
Endpoint RDS: (-h [your_endpoint_rds])
Master username: (-u admin)
Master password: (-p[your_password_rds])

mysql -h [your_endpoint_rds] -u admin -p[your_password_rds]

Output

[root@ip-xx-xx-xx-xx html]# mysql -h tinnakorn-test-rds.xxxxxxxx.ap-southeast-1.rds.amazonaws.com -u admin -pPassW0rd
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 48
Server version: 8.0.35 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

สร้าง Database

ผมจะทดสอบสร้าง Database ในฐานข้อมูล RDS โดยรันคำสั่งต่อไปนี้

ก่อนอื่นรันคำสั่งเรียกดูข้อมูลใน Database แล้วจะเห็นว่ามี Database เริ่มต้นของ RDS แสดงแบบนี้

show databases;

Output

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.026 sec)

MySQL [(none)]>


รันคำสั่งสร้าง Database โดยเปลี่ยน database_name เป็นชื่อ Database ที่ต้องการ (ตัวอย่างนี้ใช้ชื่อ tinnakorn)

CREATE DATABASE database_name;

Output

MySQL [(none)]> CREATE DATABASE tinnakorn;
Query OK, 1 row affected (0.018 sec)

MySQL [(none)]>


รันคำสั่งเรียกดูข้อมูลใน Database อีกครั้ง จะเห็นว่ามีชื่อ Database ที่เราสร้างแสดงขึ้นมา

show databases;

Output

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| tinnakorn          |
+--------------------+
5 rows in set (0.001 sec)

MySQL [(none)]>

สร้าง Table

ผมจะทำการสร้าง Table ใน Database ที่ชื่อ tinnakorn ที่สร้างจากขั้นตอนที่แล้ว

ก่อนอื่นรันคำสั่งเปลี่ยนฐานข้อมูลไปยัง Database ที่เราสร้างขึ้นมา เช่น tinnakorn (เปลี่ยน "database_name" เป็นชื่อ DB ที่สร้างจากขั้นตอนที่แล้ว)

use database_name;

Output

MySQL [(none)]> use tinnakorn;
Database changed
MySQL [tinnakorn]>


รันคำสั่งสร้าง Table โดยเปลี่ยน table_name เป็นชื่อ Table ที่ต้องการ (ตัวอย่างนี้ใช้ชื่อ test)

create table table_name (id int, message varchar(255));


รันคำสั่งเพิ่มข้อมูลลงในตารางของฐานข้อมูล โดยเปลี่ยน table_name เป็นชื่อ Table ที่สร้างจากขั้นตอนที่แล้ว (ตัวอย่างนี้จะเพิ่มข้อมูลลงใน Table ที่ชื่อ test)

insert into table_name values (1, 'text1');


รันคำสั่งแสดงข้อมูลในตาราง โดยเปลี่ยน table_name เป็นชื่อ Table ที่สร้างเมื่อสักครู่นี้ (ตัวอย่างนี้จะแสดงข้อมูลของ Table ที่ชื่อ test)

select * from table_name;

Output

MySQL [tinnakorn]> select * from test;
+------+---------+
| id   | message |
+------+---------+
|    1 | text1   |
+------+---------+
1 row in set (0.001 sec)

MySQL [tinnakorn]>


รันคำสั่งออกจากการเชื่อมต่อกับฐานข้อมูล RDS

quit


เมื่อเรามีข้อมูลใน Database แล้ว ให้ทำขั้นตอนถัดไปได้เลยครับ

Deploy PHP ใน Elastic Beanstalk

ก่อนหน้านี้เราได้แนะนำการ Deploy PHP ไปแล้ว อย่างไรก็ตาม หากต้องการแก้ไขหรือเพิ่มโปรเจกต์ เราสามารถทำได้โดย Deploy ในฟังก์ชัน Application versions ใน Environment ของเรา ซึ่งจะมาแนะนำในหัวข้อนี้ครับ

เราจะสร้างโปรแกรมที่ใช้ในการแสดงข้อมูล MySQL บนหน้าเว็บไซต์โดยเขียนลงในไฟล์ list.php เพื่อให้สามารถตรวจสอบข้อมูลที่เราได้เพิ่มลงใน Table ได้ครับ

สร้างโปรแกรมที่ใช้แสดงข้อมูล MySQL บนหน้าเว็บไซต์

เราสามารถใช้โปรแกรมอะไรก็ได้ในการสร้างไฟล์ list.php บนอุปกรณ์ของเรา แต่ครั้งนี้จะสร้างใน Notepad บน Windows

เปิด Notepad ขึ้นมา แล้วคัดลอก Code ด้านล่างนี้วางลงที่นี่
แล้วเปลี่ยนข้อมูล [$db_host, $db_name, $db_user, $db_password] ให้เป็นของคุณ
・$db_host: Endpoint RDS (เมื่อสร้าง RDS เสร็จก็จะได้ Endpoint มาและให้ Copy Endpoint มาใส่ที่นี่)
・$db_name: Database Name RDS
・$db_user: Master username
・$db_password: Master password

<?php
$db_host = '[your_endpoint_rds]';
$db_port = '3306';
$db_name = '[your_database_name]';
$db_user = 'admin';
$db_password = '[your_password_rds]';

$con = mysqli_connect($db_host, $db_user, $db_password, $db_name);
$con->set_charset('utf8mb4');

$sql = "SELECT * FROM test";
if ($result = mysqli_query($con, $sql)) {
    while ($obj = mysqli_fetch_object($result)) {
        echo "$obj->id $obj->message<br>\n";
    }
    mysqli_free_result($result);
}
mysqli_close($con);
?>

แล้ว Save ไฟล์ list.php เหมือนกับขั้นตอนของ info.php ก่อนหน้านี้ แล้วจะแสดงตามรูปภาพแบบนี้

Compress to ZIP file

จากนั้นปิด Notepad ไปได้เลย แล้วใช้เมาส์ลากครอบไฟล์ [info.php และ list.php] แล้วคลิกขวาที่ไฟล์ใดไฟล์หนึ่ง
แล้วเลือก Compress to ZIP file เพื่อบีบอัดทั้ง 2 ไฟล์เข้าด้วยกัน
*ครั้งนี้ต้องบีบอัดเข้าด้วยกันทั้ง 2 ไฟล์ เพราะถ้า Deploy ไปแล้ว ไฟล์ "info.php" ที่อัปโหลดไปก่อนหน้านั้นจะถูกลบไปครับ

แล้วจะแสดงแบบนี้ ถ้าไฟล์เป็นชื่อ "list.zip" หรือ "info.zip" ก็ไม่เป็นไร เพราะชื่อจะถูกสร้างตามเม้าส์ที่เราชี้ไฟล์นั้นก่อนบีบอัดครับ

แล้วเปลี่ยนชื่อไฟล์ ZIP เป็นวันที่และเวลาปัจจุบันเพื่อให้ง่ายต่อการดู Application versions เช่น 20240308_1600.zip แล้วคลิกเข้ามาที่ไฟล์ก็จะแสดงแบบนี้

เมื่อเตรียมไฟล์สำหรับ Deploy เสร็จแล้ว เริ่มทำขั้นตอนถัดไปได้เลยครับ

Deploy PHP ไปยัง Elastic Beanstalk ที่กำลังทำงานอยู่

Deploy PHP โดยใช้ไฟล์ zip ที่บีบอัดไว้เมื่อสักครู่นี้ไปยัง Elastic Beanstalk ที่กำลังทำงานอยู่

คลิก Environment: Your environment name และเลือก Application versions ใน "▼ Application: Your environment name"

แล้วคลิก Upload

หัวข้อ Upload Application Version
・Version label: 20220707_1457 (แนะนำให้ใส่ชื่อเดียวกับไฟล์ .zip ที่บีบอัดไว้เมื่อสักครู่นี้)
・คลิก Choose file

แล้วเลือกไฟล์จากที่เก็บไฟล์ของเรา ครั้งนี้ไฟล์ ZIP อยู่ใน Desktop แล้วคลิก Open

แล้วจะแสดง [✅ File name: 20240308_1435.zip] แบบนี้ แล้วเปลี่ยนชื่อเวอร์ชันในช่อง Version label ตามต้องการ แล้วคลิก Upload (แนะนำให้ป้อนเป็นชื่อเดียวกับไฟล์ .zip ที่บีบอัดไว้ก่อนหน้านี้)

ติ๊ก Version label ที่จะ Deploy แล้วคลิก Actions และเลือก Deploy

เลือก Environment แล้วคลิก Deploy

แล้วรอสักครู่ และ Reload แล้วดูที่ Deployed to จะเห็นว่าชื่อ Environment ของเราเลื่อนมาอยู่แถวเดียวกับเวอร์ชันล่าสุดแล้ว

ตรวจสอบ Events

ต่อไปคลิก Your environment name ใน "▼ Recent environments" จากเมนูด้านซ้าย

แล้วดูที่ช่อง Platform จะเห็นว่า Running version เป็นชื่อเวอร์ชันที่เรากำหนดไว้
และดูที่ช่อง Details ในแท็บ Events จะเห็นว่ามีการเริ่มต้นและเสร็จสิ้นการ Deploy

ทดสอบแสดงหน้าเว็บไซต์หลัง Deploy

ให้ตรวจสอบหน้าเว็บไซต์ด้วย path info.php (หน้า phpinfo) และ list.php (หน้าแสดงผลข้อมูล MySQL)

กลับมาที่หน้าเว็บไซต์ phpinfo ของไฟล์ info.php แล้ว Reload อีกครั้ง จะเห็นว่าสามารถแสดง phpinfo ได้เหมือนเดิม

ต่อไปทดสอบไฟล์ /list.php โดยเปลี่ยนเป็น URL เป็น path ด้านล่างนี้

http://[Domain Elastic Beanstalk]/list.php

แล้วจะแสดงหน้าข้อมูล MySQL ที่เพิ่มลงใน Table "test" แบบนี้

ตรวจสอบ Application ที่ Deploy แล้ว

ตรวจสอบไฟล์ PHP ที่ Deploy ใน PuTTY

กลับมาที่หน้าจอ PuTTY แล้วรันคำสั่ง cd เข้าไปที่โฟลเดอร์ /var/www/html
*ทุกครั้งที่มีการ Deploy โปรเจกต์ Path "/var/www/html" จะถูกลบและรีเซ็ตใหม่ทุกครั้ง

cd /var/www/html/

Output

[root@ip-xx-xx-xx-xx html]# cd /var/www/html/
[root@ip-xx-xx-xx-xx html]#


รันคำสั่งตรวจสอบไฟล์ที่ Deploy ไปยัง Elastic Beanstalk ใน html

ll

Output

[root@ip-xx-xx-xx-xx html]# ll
total 8
-rw-r--r--. 1 webapp webapp  17 Mar  8  2024 info.php
-rw-r--r--. 1 webapp webapp 521 Mar  8  2024 list.php
[root@ip-xx-xx-xx-xx html]#


รันคำสั่งตรวจสอบข้อมูลในไฟล์ list.php จะเห็นว่าแสดงตามที่เราสร้างไว้ (ถ้าต้องการออกจากหน้านี้ให้กดปุ่ม q)

less list.php

Output

set_charset('utf8mb4');

$sql = "SELECT * FROM test";
if ($result = mysqli_query($con, $sql)) {
    while ($obj = mysqli_fetch_object($result)) {
        echo "$obj->id $obj->message
\n";
    }
    mysqli_free_result($result);
}
mysqli_close($con);
?>
list.php (END)

ทดสอบผลการ Deploy PHP

เพิ่มข้อมูลลงใน Table

ผมจะเพิ่มข้อมูล [id: 2, message: text2 | id: 3, message: text3] ลงใน Table "test" อีกครั้ง

รันคำสั่ง MySQL เชื่อมต่อจาก Instance ไปยัง RDS อีกครั้ง (ก่อนรันคำสั่งเปลี่ยนข้อมูลใน [ ] ให้เป็นของคุณ)
Endpoint RDS: (-h [your_endpoint_rds])
Master username: (-u admin)
Master password: (-p[your_password_rds])
Database Name: ([your_database_name])

mysql -h [your_endpoint_rds] -u admin -p[your_password_rds] tinnakorn

Output

[root@ip-xx-xx-xx-xx html]# mysql -h tinnakorn-test-rds.xxxxxxxx.ap-southeast-1.rds.amazonaws.com -u admin -pPassW0rd tinnakorn
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 8.0.35 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [tinnakorn]>


รันคำสั่งเพิ่มข้อมูล [id: 2, message: text2 | id: 3, message: text3] ลงใน Table "test" และแสดงผลข้อมูล (สามารถรันคำสั่งพร้อมกันได้เลย)

insert into test values (2, "text2");
insert into test values (3, "text3");
select * from test;

Output

MySQL [tinnakorn]> insert into test values (2, "text2");
Query OK, 1 row affected (0.005 sec)

MySQL [tinnakorn]> insert into test values (3, "text3");
Query OK, 1 row affected (0.005 sec)

MySQL [tinnakorn]> select * from test;
+------+---------+
| id   | message |
+------+---------+
|    1 | text1   |
|    2 | text2   |
|    3 | text3   |
+------+---------+
3 rows in set (0.001 sec)

MySQL [tinnakorn]>

ทดสอบแสดงผลหน้าเว็บไซต์หลังเพิ่มข้อมูลลงใน Table

กลับมาที่หน้าเว็บไซต์แล้ว Reload อีกครั้ง จะเห็นว่ามีข้อมูล [2 text2 และ 3 text3] เพิ่มขึ้นมา

เพียงเท่านี้ก็สามารถ Deploy ไฟล์ [info.php และ list.php] ไปยัง Elastic Beanstalk และแสดงข้อมูลตามที่เพิ่มลงใน Table ของ Database RDS ได้แล้วครับ

ลบ AWS Resource ที่สร้างขึ้นในบทความนี้

ลบเรียงตาม AWS Resource ดังนี้

  • RDS
    • Databases
  • Elastic Beanstalk
    • Environments (Terminate)
    • Applications
  • Amazon EC2
    • Key Pairs
    • Security Groups (RDS)
    • Security Groups (Elastic Beanstalk)

ลบ RDS

ดูตัวอย่างที่นี่เฉพาะหัวข้อหลักนี้: วิธีการลบ RDS

ลบ Environments และ Applications ใน Elastic Beanstalk

ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: การลบ Environments และ Applications ใน Elastic Beanstalk

ลบ Key Pair และ Security Groups ใน Amazon EC2

ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้

สรุป

การสาธิตนี้เราได้ Deploy PHP (ไฟล์ info.php และ list.php) ไปยัง Elastic Beanstalk แล้วเชื่อมต่อกับ RDS และเพิ่มข้อมูลใน Database แล้วทดสอบการแสดงผลข้อมูลที่เพิ่มลงใน Database ด้วยไฟล์ list.php บนหน้าเว็บไซต์

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !

บทความที่เกี่ยวข้อง

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.